#include <iostream>
#include <string>
#define NOMINMAX // 斩杀min/max宏
#include <windows.h>
/**
 * @brief 向用户提出一个带有默认选项的Yes/No问题，并根据用户输入返回布尔值。
 *        Presents a Yes/No question with a default option to the user and returns a boolean based on the user's input.
 *
 * 该函数会向用户提出一个问题，并允许用户输入Yes或No来回答。根据用户输入和函数参数，
 * 函数会返回相应的布尔值。默认情况下，用户可以直接按回车键选择默认选项。
 * This function presents a question to the user and allows them to answer with Yes or No. Based on the user's input and the function parameters,
 * it returns a corresponding boolean value. By default, the user can press Enter to select the default option.
 *
 * @param Qus 向用户提出的问题字符串。The question string presented to the user.
 * @param Default 默认选项，true表示默认选择Yes，false表示默认选择No。
 *                The default option, true means defaulting to Yes, false means defaulting to No.
 * @param UnchageIt 控制返回值是否与默认选项一致，true表示返回值与默认选项一致，false表示相反。
 *                  Controls whether the return value aligns with the default option, true means the return value matches the default, false means the opposite.
 * @return bool 根据用户输入和参数返回的布尔值。The boolean value returned based on the user's input and parameters.
 *
 * @example
 * AskQusEx("Do you want to continue?", true, true)
 * 控制台输出: Do you want to continue? (Y/n)?
 * Console output: Do you want to continue? (Y/n)?
 * 用户输入: yes
 * User input: yes
 * 返回值: true
 * Return value: true
 * 用户输入: no
 * User input: no
 * 返回值: false
 * Return value: false
 * 其他输入: 返回默认值 true
 * Other inputs: Returns the default value true
 */
bool AskQusEx(std::string Qus, bool Default, bool UnchageIt) {
    // 根据默认选项显示不同的提示信息
    // Display different prompts based on the default option
    if (Default) {
        std::cout << Qus << " (Y/n";
    } else {
        std::cout << Qus << " (y/N";
    }
    std::cout << ")? ";

    // 获取用户输入并将其转换为小写
    // Get user input and convert it to lowercase
    std::string Ans;
    std::cin >> Ans;
    for (int i = 0; i < Ans.length(); i++) {
        Ans[i] = tolower(Ans[i]);
    }

    // 根据用户输入和UnchageIt参数决定返回值
    // Determine the return value based on user input and the UnchageIt parameter
    if (UnchageIt) {
        if (Ans.find('y') != std::string::npos)   return UnchageIt;
        else if (Ans.find('n') != std::string::npos) return !UnchageIt;
        else  return Default;
    } else {
        if (Ans.find('y') != std::string::npos)   return !UnchageIt;
        else if (Ans.find('n') != std::string::npos) return UnchageIt;
        else  return !Default;
    }
}

#define GetInputEx(x) cin >> x;
#define CONSOLE std::cout
#define CONSOLE_ENDL std::endl
#define CONSOLE_FLUSH_TMP std::flush

/**
 * @brief JokingError 函数
 * 
 * 该函数用于在控制台输出一个带有幽默性质的错误信息，并等待用户按下任意键后退出。
 * 函数的主要目的是在调试过程中以轻松的方式提示用户某个任务出现了问题。
 * 
 * @return void 无返回值
 */
void JokingError() {
    // 输出带有颜色的错误信息，使用 ANSI 转义序列设置文本颜色和背景颜色
    std::cout << "\033[37;44mo(T^To)\n";
    std::cout << "The JunCmd Task Has A Problem.\n";
    std::cout << "Please Contact Ate_CaO2_Toothie For Help.\n";
    std::cout << "Press Any Key to Skip\n";
    std::cout << "(Just kidding) (it's just a debug joke)";
    
    // 重置控制台颜色为默认值
    std::cout << "\033[0m" << std::endl;
    
    // 等待用户按下任意键
    std::getchar();
    
    // 函数结束，优雅退出
    return;
}